package com.liuyi.tools.kits;


import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * @author Mr.fmy
 * @version 1.0.0
 * @ClassName TreeKit
 * @Description TODO 转换成树结构
 * @createTime 2019/9/27 17:29
 */
public class ConvertTreeKit {


    /**
     * 转换树菜单
     *
     * @param tree    数据
     * @param function 验证是否为当前最高层级
     */
    public static <T extends TreeInterface<T>> List<T> convert(List<T> tree, Function<T, Boolean> function) {
        List<T> result = new ArrayList<>();
        //循环第一层级
        tree.forEach(item -> {
            if (function.apply(item)) {
                result.add(item);
            }
        });
        //递归
        result.forEach(item -> {
            List<T> childs = recursion(item, tree);
            if (childs.size() > 0) {
                item.children(childs);
            }
        });
        return result;
    }

    /**
     * 递归
     *
     * @param t     需要查找子元素的元素
     * @param datas 所有数据
     * @param <T>   泛型
     * @return 该元素的所有子元素集合
     */
    private static <T extends TreeInterface<T>> List<T> recursion(T t, List<T> datas) {
        List<T> result = new ArrayList<>();
        datas.forEach(item -> {
            if (t.keyValue().equals(item.faterKetValue())) {
                result.add(item);
            }
        });
        //递归
        result.forEach(item -> {
            List<T> childs = recursion(item, datas);
            if (childs.size() > 0) {
                item.children(childs);
            }
        });
        return result;
    }

    public interface TreeInterface<T extends TreeInterface> {

        /**
         * 唯一标识字段值
         */
        String keyValue();

        /**
         * 子类
         */
        void children(List<T> treeChildren);

        /**
         * 父标识字段值
         */
        String faterKetValue();

    }
}
